package fiuba.td.fabrica.model.entities;

import fiuba.td.fabrica.constants.GlobalConstants;
import fiuba.td.fabrica.model.exceptions.ConexionCintaTransportadoraOcupadaException;
import fiuba.td.fabrica.model.exceptions.ConexionConectableOcupadoException;

/**
 * Elemento que une conectables
 */
public class CintaTransportadora extends ElementoFabrica{

	public static final double COSTO_METRO = 10.0;
	public static final String ICONO = "cintaGay.jpg";
	
	private double longitud;
	private Maquina elementoSalida;		// Maquina donde la cinta es salida
	private Conectable elementoEntrada; // Conectable donde la cinta es entrada
	
	public CintaTransportadora(double longitud) {
		super (longitud * COSTO_METRO);
		this.longitud = longitud;
	}

	public double getLongitud() {
		return longitud;
	}
	
	public void setLongitud(double longitud) {
		this.longitud = longitud;
		this.setCosto(longitud * COSTO_METRO);
	}
	
	public Maquina getElementoSalida() {
		return elementoSalida;
	}
	
	public void setElementoSalida(Maquina elementoSalida) {
		this.elementoSalida = elementoSalida;
	}
	
	public Conectable getElementoEntrada() {
		return elementoEntrada;
	}
	
	public void setElementoEntrada(Conectable elementoEntrada) {
		this.elementoEntrada = elementoEntrada;
	}
	
	/**
	 * Conecta la cinta como salida de una maquina o como entrada de una maquina o
	 * salida de fabrica
	 */
	public void conectar(Maquina elementoSalida, Conectable elementoEntrada) 
		throws 	ConexionCintaTransportadoraOcupadaException, 
				ConexionConectableOcupadoException {
		
		if (this.elementoSalida != null)
			throw new ConexionCintaTransportadoraOcupadaException(
					"La cinta ya est{a conectada a la salida de un elemento.");

		if (this.elementoEntrada != null)
			throw new ConexionCintaTransportadoraOcupadaException(
						"La cinta ya est{a conectada a la salida de un elemento.");
		
		elementoSalida.conectarSalida(this);
		elementoEntrada.conectarEntrada(this);
		
		this.elementoSalida  = elementoSalida;
		this.elementoEntrada = elementoEntrada;
	}

	public void desconectarEntrada() {
		if (this.elementoEntrada!=null)
			this.elementoEntrada.desconectarEntrada();
		this.elementoEntrada = null;
	}

	public void desconectarSalida() {
		if (this.elementoSalida!=null)
			this.elementoSalida.desconectarSalida();
		this.elementoSalida = null;		
	}
	
	public void eliminar(){
		this.setChanged();
		this.notifyObservers(GlobalConstants.PANTALLA_ACCIONES.QUITAR_CINTA);
	}

	
	public String getIcono() {
		return ICONO;
	}
	
	public String getDescripcion(){
		return "Cinta Transportadora";
	}
}